package com.iflysse.controller;


import com.iflysse.common.ResultEnum;
import com.iflysse.pojo.bo.CommonBoResp;
import com.iflysse.pojo.bo.req.*;
import com.iflysse.pojo.bo.resp.*;
import com.iflysse.pojo.vo.common.CommonVoResp;
import com.iflysse.pojo.vo.req.*;
import com.iflysse.pojo.vo.resp.*;
import com.iflysse.services.CourseService;
import com.iflysse.services.LabelService;
import com.iflysse.util.CommonUtil;
import com.iflysse.util.FileUpdateUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.log4j.Log4j;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/teacherCourse")
@Api(value = "教师端课程接口")
@Log4j
public class TeacherCourseController {



    @Autowired
    private CourseService courseService;
    @Autowired
    private LabelService labelService;


    /**
     * 发布课程or取消课程
     * @return
     */
//    @PostMapping("/updateCourseStatus")
//    @ApiOperation(value = "修改课程状态：发布课程/取消发布")
//    public CommonVoResp updateCourseStatus(UpdateCourseStatusVoReq updateCourseStatusVoReq){
//        CommonVoResp commonVoResp=new CommonVoResp();
//        commonVoResp.setMsg("修改成功");
//        commonVoResp.setCode(1000);
//        return commonVoResp;
//    }



    /**
     * 教师端课程管理接口，即查询课程详情
     * @param queryTeacherCourseInfoVoReq
     * @return
     */
    @PostMapping("/queryTeacherCourseInfo")
    @ApiOperation(value = "教师端课程管理接口")
    public QueryTeacherCourseInfoVoResp queryTeacherCourseInfo(QueryTeacherCourseInfoVoReq queryTeacherCourseInfoVoReq){
        QueryTeacherCourseInfoVoResp queryTeacherCourseInfoVoResp=new QueryTeacherCourseInfoVoResp();
        try {

            log.info("老师端查询课程详情接口参数bean:"+queryTeacherCourseInfoVoReq);
            CourseIdBoReq courseIdBoReq= CommonUtil.objToObj(queryTeacherCourseInfoVoReq,CourseIdBoReq.class);

            CourseDetailBoResp courseDetailBoResp= courseService.queryDetailByCourseId(courseIdBoReq);
            log.info("老师端根据课程编号："+queryTeacherCourseInfoVoReq.getCourseId()+"查询的信息为："+courseDetailBoResp);

            QueryTeacherCourseInfoResp queryTeacherCourseInfoResp=new QueryTeacherCourseInfoResp();

            queryTeacherCourseInfoResp.setBaseImg(FileUpdateUtil.prefixResources+courseDetailBoResp.getCourseCover());//课程封面
            queryTeacherCourseInfoResp.setChaptersNum(courseDetailBoResp.getChapterAmount());//章数量
            queryTeacherCourseInfoResp.setCourseId(courseDetailBoResp.getCourseId());//课程编号
            queryTeacherCourseInfoResp.setCourseName(courseDetailBoResp.getCourseName());//课程名称
            if(courseDetailBoResp.getCourseLabels()!=null&&courseDetailBoResp.getCourseLabels().size()>0){
                List<LabelListResp>labelList=new ArrayList<LabelListResp>();
                courseDetailBoResp.getCourseLabels().forEach(labelBoResp -> {
                    LabelListResp labelListResp=new LabelListResp();
                    labelListResp.setLabelName(labelBoResp.getLabelTitle());
                    labelListResp.setLabelId(labelBoResp.getLabelId());
                    labelList.add(labelListResp);
                });
                queryTeacherCourseInfoResp.setLabelList(labelList);//标签列表
            }
            queryTeacherCourseInfoVoResp.setResult(queryTeacherCourseInfoResp);
            queryTeacherCourseInfoVoResp.setMsg(ResultEnum.SUCCESS.getMsg());
            queryTeacherCourseInfoVoResp.setCode(ResultEnum.SUCCESS.getCode());
            log.info("老师端查询课程详情接口响应bean:"+queryTeacherCourseInfoVoResp);

            return queryTeacherCourseInfoVoResp;
        }catch (Exception e){
            log.error("老师端查询课程详情接口出现异常，信息为："+e);
            CommonUtil.printError(queryTeacherCourseInfoVoResp);
            return queryTeacherCourseInfoVoResp;
        }
    }




    /**
     * 教师端查询我的课程
     * @param teacherCourseVoReq
     * @return
     */
    @PostMapping("queryTeacherCourse")
    @ApiOperation("教师端查询我的课程")
    public TeacherCourseVoResp queryTeacherCourse(TeacherCourseVoReq teacherCourseVoReq){
        TeacherCourseVoResp teacherCourseVoResp=new TeacherCourseVoResp();
        try{
           log.info("教师端查询我的课程参数bean:"+teacherCourseVoReq);
            //VO参数转变BO参数
            TeacherIdBoReq teacherIdBoReq=CommonUtil.objToObj(teacherCourseVoReq,TeacherIdBoReq.class);
            teacherIdBoReq.setTeacherId(teacherCourseVoReq.getUserId());
            CourseAllBoResp courseAllBoResp=  courseService.queryCourseTop6ByTeacherId(teacherIdBoReq);

            List<CourseBoResp> list=courseAllBoResp.getCourseBoResps();
            List<TeacherCourseResp> result=new ArrayList<TeacherCourseResp>();
            list.forEach(courseBoResp -> {
                TeacherCourseResp teacherCourseResp=new TeacherCourseResp();
                teacherCourseResp.setCourseId(courseBoResp.getCourseId());//课程编号
                teacherCourseResp.setCourseName(courseBoResp.getCourseName());//课程名称
                teacherCourseResp.setUpdateTime(CommonUtil.dateSourceToString(courseBoResp.getUpdateTime(),CommonUtil.pattern));//更新时间
                teacherCourseResp.setBaseImg(FileUpdateUtil.prefixResources+courseBoResp.getCourseCover());//课程封面
                result.add(teacherCourseResp);
            });
            teacherCourseVoResp.setResult(result);
            teacherCourseVoResp.setMsg(ResultEnum.SUCCESS.getMsg());
            teacherCourseVoResp.setCode(ResultEnum.SUCCESS.getCode());

            log.info("教师端查询我的课程响应bean:"+teacherCourseVoResp);
            return teacherCourseVoResp;
        }catch (Exception e){
            log.error("教师端查询我的课程时出现异常，信息为："+e);
            CommonUtil.printError(teacherCourseVoResp);
            return teacherCourseVoResp;
        }
    }


    /**
     * 教师端创建教学班级时查询教学课程列表接口
     * @param teacherCourseVoReq
     * @return
     */
    @PostMapping("/queryAllTeacherCourse")
    @ApiOperation("教师端创建教学班级时查询教学课程列表接口")
    public TeacherAllCourseVoResp queryAllTeacherCourse(TeacherCourseVoReq teacherCourseVoReq){
        TeacherAllCourseVoResp teacherAllCourseVoResp=new TeacherAllCourseVoResp();
        try{
            log.info("教师端创建教学班级时查询教学课程列表参数："+teacherCourseVoReq);

            TeacherIdBoReq teacherIdBoReq=CommonUtil.objToObj(teacherCourseVoReq,TeacherIdBoReq.class);
            teacherIdBoReq.setTeacherId(teacherCourseVoReq.getUserId());
            CourseAllBoResp courseAllBoResp= courseService.queryAllCourseByTeacherId(teacherIdBoReq);
            log.info("教师端教师编号："+teacherCourseVoReq.getUserId()+"创建教学班级时查询教学课程列表响应bean:"+courseAllBoResp);
            if(courseAllBoResp==null){
                CommonUtil.printError(teacherAllCourseVoResp);
                return teacherAllCourseVoResp;
            }

            List<CourseBoResp> courseBoResps= courseAllBoResp.getCourseBoResps();
            if(courseBoResps==null&&courseBoResps.size()==0){
                teacherAllCourseVoResp.setMsg(ResultEnum.NOTHAVECOURSE.getMsg());
                teacherAllCourseVoResp.setCode(ResultEnum.NOTHAVECOURSE.getCode());
                return teacherAllCourseVoResp;
            }

            List<TeacherCourseResp> result =new ArrayList<TeacherCourseResp>();

            courseBoResps.forEach(courseBoResp -> {
                TeacherCourseResp teacherCourseResp=new TeacherCourseResp();
                teacherCourseResp.setCourseId( courseBoResp.getCourseId());//课程编号
                teacherCourseResp.setCourseName(courseBoResp.getCourseName());//课程名称
                result.add(teacherCourseResp);
            });

            teacherAllCourseVoResp.setResult(result);
            teacherAllCourseVoResp.setCode(ResultEnum.SUCCESS.getCode());
            teacherAllCourseVoResp.setMsg(ResultEnum.SUCCESS.getMsg());
            log.info("教师端创建教学班级时查询教学课程列表响应bean信息："+teacherAllCourseVoResp);
            return teacherAllCourseVoResp;

        }catch (Exception e){
            log.error("教师端创建教学班级时查询教学课程列表出现异常，信息为："+e);
            CommonUtil.printError(teacherAllCourseVoResp);
            log.info("教师端创建教学班级时查询教学课程列表响应bean信息："+teacherAllCourseVoResp);
            return teacherAllCourseVoResp;
        }
    }



    /**
     * 教师端添加课程
     * @param
     * @return
     */
    @PostMapping("addTeacherCourse")
    @ApiOperation("教师端创建我的课程")
    public CommonVoResp addTeacherCourse(@RequestParam("courseBaseImg") MultipartFile file, AddTeacherCourseVoReq teacherCourseVoReq){

        CommonVoResp commonVoResp =new CommonVoResp();
        try{

            log.info("教师端创建课程请求参数："+teacherCourseVoReq);
            String path=FileUpdateUtil.fileUploadToBoot(file,FileUpdateUtil.courseCoverSuffix);

            AddCourseBoReq addCourseBoReq=CommonUtil.objToObj(teacherCourseVoReq,AddCourseBoReq.class);
            addCourseBoReq.setCourseCover(path);
            addCourseBoReq.setLabelIdList(teacherCourseVoReq.getCourseLabels());
            CommonBoResp commonBoResp=courseService.addCourse(addCourseBoReq);
            CommonUtil.printBoResultToVoResult(commonBoResp,commonVoResp);
            log.info("教师端创建课程响应bean信息："+commonVoResp);
            return commonVoResp;

        }catch (Exception e){
            log.info("教师端创建课程时出现异常,信息为："+e);
            CommonUtil.printError(commonVoResp);
            return commonVoResp;
        }
    }

    @PostMapping("/updateTeacherCourse")
    @ApiOperation(value = "教师端修改课程信息接口")
    public CommonVoResp updateTeacherCourse(@RequestParam("courseCover") MultipartFile file,UpdateTeacherCourseVoReq teacherCourseVoReq){
        CommonVoResp commonVoResp=new CommonVoResp();
        try{

            log.info("教师端修改课程信息："+teacherCourseVoReq);
            String path=FileUpdateUtil.fileUploadToBoot(file,FileUpdateUtil.courseCoverSuffix);

            UpdateCourseBoReq updateCourseBoReq= CommonUtil.objToObj(teacherCourseVoReq, UpdateCourseBoReq.class);
            updateCourseBoReq.setCourseCover(path);
            log.info("教师端修改课程信息调用业务层接口参数："+updateCourseBoReq);
            CommonBoResp commonBoResp=  courseService.updateCourse(updateCourseBoReq);
            CommonUtil.printBoResultToVoResult(commonBoResp,commonVoResp);
            log.info("教师端修改课程信息响应bean信息："+commonVoResp);
            return commonVoResp;
        }catch (Exception e){
            log.info("教师端修改课程信息出现异常，信息为："+e);
            CommonUtil.printError(commonVoResp);
            return commonVoResp;
        }
    }


    /**
     * 教师端标签列表
     * @param
     * @return
     */
    @PostMapping("queryLabelList")
    @ApiOperation("教师端标签列表")
    public LabelListVoResp queryLabelList(){

        LabelListVoResp labelListVoResp=new LabelListVoResp();
        try{
            LabelAllBoResp labelAllBoResp= labelService.getAllLabels();
            List<LabelBoResp> lists=  labelAllBoResp.getLabelAllBoResp();
            List<LabelListResp>labelListResps=new ArrayList<LabelListResp>();
            lists.forEach(labelBoResp -> {
                LabelListResp labelListResp=new LabelListResp();
                labelListResp.setLabelId(labelBoResp.getLabelId());//编号编号
                labelListResp.setLabelName(labelBoResp.getLabelTitle());//编号名称
                labelListResps.add(labelListResp);
            });
            labelListVoResp.setResult(labelListResps);
            labelListVoResp.setCode(ResultEnum.SUCCESS.getCode());
            labelListVoResp.setMsg(ResultEnum.SUCCESS.getMsg());
            log.info("教师端查询标签列表响应信息："+labelListVoResp);
            return labelListVoResp;

        }catch (Exception e){
            log.info("教师端查询标签列表出现异常，信息为："+e);
            CommonUtil.printError(labelListVoResp);
            return labelListVoResp;
        }
    }


    /**
     * 教师端添加标签接口
     * @param addLabelVoReq
     * @return
     */
    @PostMapping("/addLabel")
    @ApiOperation(value = "教师端添加标签")
    public CommonVoResp addLabel(AddLabelVoReq addLabelVoReq){
        CommonVoResp commonVoResp=new CommonVoResp();

        try{

            log.info("教师端添加标签参数bean:"+addLabelVoReq);
            AddLabelBoReq addLabelBoReq=  CommonUtil.objToObj(addLabelVoReq, AddLabelBoReq.class);
            addLabelBoReq.setLabelTitle(addLabelVoReq.getLabelName());
            log.info("老师端添加标签业务层接口入参："+addLabelBoReq);
            CommonBoResp commonBoResp= labelService.addLabel(addLabelBoReq);
            CommonUtil.printBoResultToVoResult(commonBoResp,commonVoResp);
            log.info("老师端添加标签响应信息为："+commonVoResp);
            return commonVoResp;
        }catch (Exception e){
            log.info("老师端添加标签出现异常，信息为："+e);
            CommonUtil.printError(commonVoResp);
            return commonVoResp;
        }
    }


    /**
     * 教师端删除标签接口
     * @param deleteLabelVoReq
     * @return
     */
    @PostMapping("/deleteLabel")
    @ApiOperation(value = "教师端删除标签")
    public CommonVoResp deleteLabel(DeleteLabelVoReq deleteLabelVoReq){
        CommonVoResp commonVoResp=new CommonVoResp();
        try {
           log.info("教师端删除标签参数bean:"+deleteLabelVoReq);
            DeleteLabelBoReq deleteLabelBoReq=CommonUtil.objToObj(deleteLabelVoReq,DeleteLabelBoReq.class);
            log.info("教师端删除标签调用业务接口参数为："+deleteLabelBoReq);
            CommonBoResp commonBoResp= labelService.deleteLabel(deleteLabelBoReq);
            CommonUtil.printBoResultToVoResult(commonBoResp,commonVoResp);
            log.info("老师端删除标签响应信息为："+commonVoResp);
            return commonVoResp;
        }catch (Exception e){
            log.info("老师端删除标签出现异常，信息为："+e);
            CommonUtil.printError(commonVoResp);
            return commonVoResp;
        }
    }


    /**
     * 教师端修改标签接口
     * @param updateLabelVoReq
     * @return
     */
    @PostMapping("/updateLabel")
    @ApiOperation(value = "教师端修改标签")
    public CommonVoResp updateLabel(UpdateLabelVoReq updateLabelVoReq){
        CommonVoResp commonVoResp=new CommonVoResp();
        try {
            log.info("教师端修改标签参数bean:"+updateLabelVoReq);
            LabelBoReq labelBoReq=CommonUtil.objToObj(updateLabelVoReq,LabelBoReq.class);
            labelBoReq.setLabelTitle(updateLabelVoReq.getLabelName());
            log.info("老师端修改标签业务接口的参数bean:"+labelBoReq);
            CommonBoResp commonBoResp= labelService.updateLabel(labelBoReq);
            CommonUtil.printBoResultToVoResult(commonBoResp,commonVoResp);
            log.info("老师端修改标签响应信息为："+commonVoResp);
            return commonVoResp;
        }catch (Exception e){
            log.info("老师端修改标签出现异常，信息为："+e);
            CommonUtil.printError(commonVoResp);
            return commonVoResp;
        }
    }

}
